package kr.hkit.powerjava.chapter22;

public class Array {

	public static <T> T getLast(T[] a) {
		return a[a.length - 1];
	}

	public static <T extends Comparable<T>> T getMax(T[] a){
		
		//T는 무조건 Comparable된 것의 객체만 사용가능함
		if(a == null || a.length == 0){
			return null;
		}
		
		T largest = a[0];
		
		for(int i = 1; i<a.length; i++){
			if(largest.compareTo(a[i]) < 0){
				largest = a[i];
			}
		}
		return largest;
	}
	
	public static <T extends Comparable<T>> T getMin(T[] a){
		if(a == null || a.length == 0){
			return null;
		}
		
		T smallest = a[0];
		for(int i = 1; i<a.length; i++){
			if(smallest.compareTo(a[i]) > 0){
				smallest = a[i];
			}
		}
		return smallest;
	}

	public static void main(String[] args) {
		String[] language = { "JAVA", "C#", "C++", "Basic" };

		String last = Array.getLast(language);
		// last = Array.<String>getLast(language);
		System.out.println(last);

		Integer[] arr = { 5, 4, 3, 2, 1 };// int로 쓰면 오류납니다
		// T는 wrapper class로 사용가능, 기본형 사용x
		int aLast = Array.getLast(arr);
		System.out.println(aLast);
		
		int aMax = Array.getMax(arr);
		System.out.println("Max: " + aMax);
		
		int aMin = Array.getMin(arr);
		System.out.println("Min: " + aMin);
		
		Test[] arrTest = new Test[3];
		arrTest[0] = new Test(5);
		arrTest[1] = new Test(4);
		arrTest[2] = new Test(3);
		
		System.out.println("Max: " + Array.getMax(arrTest));
		//implements Comparable<Test>를 붙이기 전에는 오류가 난다
		//Test객체는 Comparable을 구현하지 않았기때문에
		
		
		System.out.println("Min: " + Array.getMin(arrTest));
	}
}

class Test implements Comparable<Test>{
	private int a;

	public Test(int a) {
		super();
		this.a = a;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	@Override
	public int compareTo(Test o) {
		return a - o.a;
	}

	@Override
	public String toString() {
		return String.format("Test [a=%s]", a);
	}
}
